from PySide2.QtWidgets import QApplication
from PySide2.QtCore import Signal, QObject
from PySide2.QtUiTools import QUiLoader
from PySide2 import QtWidgets
import cv2
import numpy as np
import matplotlib.pyplot as plt
from lib.get_imgs import *
from matplotlib.figure import Figure
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg, NavigationToolbar2QT as NavigationToolbar

# 创建一个继承自FigureCanvasQTAgg的类
# 也就是一个 QWidget 的子类

class MplCanvas(FigureCanvasQTAgg):

    def __init__(self, parent=None, width=5, height=4, dpi=100):
        fig = Figure(figsize=(width, height), dpi=dpi)
        self.axes = fig.add_subplot(111)
        # 一定要把Figure对象作为参数传递进去
        super().__init__(fig)


# 自定义信号源对象类型，一定要继承自 QObject
class MySignals(QObject):
    # 定义一种信号，
    text_print = Signal(str)


# 实例化
global_ms = MySignals()


class normal_abnormal(QtWidgets.QMainWindow):

    def __init__(self, *args, **kwargs):
        super(normal_abnormal, self).__init__(*args, **kwargs)

        # 从 UI 定义中动态 创建一个相应的窗口对象
        self.ui = QUiLoader().load('split_abnormal.ui')
        self.src_dir_img_list = []

        # 记录当前图像的位置
        self.img_num = 0
        self.img_sum = 0

        self.main_get_imgs()
        # 获取源文件夹所有图像
        self.ui.input_src_dir.textChanged.connect(self.main_get_imgs)
        # 按下下一张按钮
        self.ui.btn_next_image.clicked.connect(self.show_next_image)
        # 按下上一张按钮
        self.ui.btn_previous_image.clicked.connect(self.show_before_image)
        # 获取任意图像
        self.ui.input_img_num.textChanged.connect(self.get_cur_num)
        # 按下异常图像按钮
        self.ui.btn_abnormal.clicked.connect(self.save_cur_image)

        self.img_show = None
        # 自定义信号的处理函数
        # global_ms.text_print.connect(self.printToGui)
        # 当前主程序需要使用的全局变量
        self.toolbar_flag = 0           # 控制matplotlib控制栏的显示

    def show_next_image(self):
        self.img_sum = len(self.src_dir_img_list[1])
        self.img_num += 1
        if self.img_num >= self.img_sum-1:
            self.img_num = self.img_sum-1
        self._img_show()

    def show_before_image(self):
        self.img_num -= 1
        if self.img_num <= 0:
            self.img_num = 0
        self._img_show()

    def _img_show(self):
        plt.close()
        img_path = os.path.join(self.src_dir_img_list[0], self.src_dir_img_list[1][self.img_num])
        # img = cv2.imread(img_path)
        img = cv2.imdecode(np.fromfile(img_path, dtype=np.uint8), -1)
        ## imdecode读取的是rgb，如果后续需要opencv处理的话，需要转换成bgr，转换后图片颜色会变化
        img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)

        # 绘制图 matplotlib
        if self.img_show is not None:       # 如果当前已经显示了图像，那就先清除掉，以备下一张图像使用
            plt.clf()
            self.ui.LayoutForDA.removeWidget(self.img_show)
            self.ui.LayoutForDA.removeWidget(self.toolbar)

        self.img_show = MplCanvas(self, width=5, height=4, dpi=100)
        self.toolbar = NavigationToolbar(self.img_show, self)

        # 添加 图 到 layout中
        self.ui.LayoutForDA.addWidget(self.toolbar)
        self.ui.LayoutForDA.addWidget(self.img_show)

        self.img_show.axes.imshow(img)

        # plt.imshow(img)
        # plt.show()

        # 显示当前图像数量
        self.ui.cur_num.setText(f'{self.img_num}')
        self.ui.sum_num.setText(f'{self.img_sum}')
        self.ui.cur_img_name.setText(f'{img_path}')

    def save_cur_image(self):
        img_path_src = os.path.join(self.src_dir_img_list[0], self.src_dir_img_list[1][self.img_num])
        # img_cur = cv2.imread(img_path_src)
        img_cur = cv2.imdecode(np.fromfile(img_path_src, dtype=np.uint8), -1)
        # img_cur = cv2.cvtColor(img_cur, cv2.COLOR_RGB2BGR)

        img_path_des = os.path.join(self.ui.input_des_dir.text(), self.src_dir_img_list[1][self.img_num])
        # cv2.imwrite(img_path_des, img_cur)
        cv2.imencode('.jpg', img_cur)[1].tofile(f'{img_path_des}')

        # 重置列表
        os.remove(img_path_src)
        self.main_get_imgs()
        img_path_new = os.path.join(self.src_dir_img_list[0], self.src_dir_img_list[1][self.img_num])

        self._img_show()

        # 显示当前图像数量
        self.ui.cur_num.setText(f'{self.img_num}')
        self.ui.sum_num.setText(f'{self.img_sum}')
        self.ui.cur_img_name.setText(f'{img_path_new}')

    def main_get_imgs(self):
        src_dir_path = self.ui.input_src_dir.text()
        self.src_dir_img_list = get_all_imgs(src_dir_path)

    def get_cur_num(self):
        self.img_num = int(self.ui.input_img_num.text())
        self.ui.cur_num.setText(f'{self.img_num}')
        self.ui.sum_num.setText(f'{self.img_sum}')


app = QApplication([])
# 加载 icon
# app.setWindowIcon(QIcon('logo.png'))
normal_abnormal = normal_abnormal()
normal_abnormal.ui.show()
app.exec_()
